#include <iostream>
#include <immintrin.h> // 包含AVX指令集相关的头文件
#include <Windows.h>   // 包含Windows平台API头文件

// 定义一个辅助函数，将八个float值加载到AVX寄存器中
__m256 load8Float(const float* addr) {
    return _mm256_load_ps(addr);
}

// 定义一个辅助函数，将AVX寄存器中的八个float值存储到内存中
void store8Float(float* addr, __m256 value) {
    _mm256_store_ps(addr, value);
}

void gaussianEliminationAVX(float* A, int n) {
    for (int k = 0; k < n - 1; ++k) {
        __m256 vt = load8Float(&A[k * n + k]);
        for (int j = k + 1; j + 8 <= n; j += 8) {
            __m256 va = load8Float(&A[k * n + j]);
            va = _mm256_div_ps(va, vt);
            store8Float(&A[k * n + j], va);
        }
        for (int j = k + 1; j < n; ++j) {
            A[k * n + j] /= A[k * n + k];
        }
        A[k * n + k] = 1.0f;
        for (int i = k + 1; i < n; ++i) {
            __m256 vaik = load8Float(&A[i * n + k]);
            for (int j = k + 1; j + 8 <= n; j += 8) {
                __m256 vakj = load8Float(&A[k * n + j]);
                __m256 vaij = load8Float(&A[i * n + j]);
                __m256 vx = _mm256_mul_ps(vakj, vaik);
                vaij = _mm256_sub_ps(vaij, vx);
                store8Float(&A[i * n + j], vaij);
            }
            for (int j = k + 1; j < n; ++j) {
                A[i * n + j] -= A[k * n + j] * A[i * n + k];
            }
            A[i * n + k] = 0.0f;
        }
    }
    A[(n - 1) * n + n - 1] = 1.0f;
}

int main() {
    const int n = 32; // 定义矩阵大小为32x32
    float A[n * n];   // 定义矩阵

    // 初始化矩阵为100以内的随机数
    srand(static_cast<unsigned int>(time(nullptr))); // 使用当前时间作为随机数种子
    for (int i = 0; i < n * n; ++i) {
        A[i] = static_cast<float>(rand() % 100); // 生成0到99的随机数
    }

    // 获取性能计数器的频率
    LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);

    // 记录开始时间
    LARGE_INTEGER head;
    QueryPerformanceCounter(&head);

    // 调用AVX指令集下的高斯消元函数
    gaussianEliminationAVX(A, n);

    // 记录结束时间
    LARGE_INTEGER tail;
    QueryPerformanceCounter(&tail);

    // 计算消耗的时间（单位：毫秒）
    double Mytime = static_cast<double>(tail.QuadPart - head.QuadPart) * 1000.0 / freq.QuadPart;

    // 打印消耗的时间
    std::cout << "AVX指令集下的高斯消元函数运行时间: " << Mytime << " ms" << std::endl;

    return 0;
}
